#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+7;
struct node
{
	int l,r,id;
}q[N];
int n,m;
inline int read()
{
	int X=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9'){X=(X<<1)+(X<<3)+ch-'0';ch=getchar();}
	return X;
}
int p[N];
struct edge
{
	int y,next;
}e[2*N];
int Link[N],t=0;
void add(int x,int y)
{
	e[++t].y=y;
	e[t].next=Link[x];
	Link[x]=t;
}
int dfn[N],tot=0,seq[N];
int dep[N];
int pos[N],cnt=0;
void dfs(int x)
{
	pos[x]=++cnt;
	seq[++tot]=x;
	dfn[x]=tot;
	for(int i=Link[x];i;i=e[i].next)
	{
		int y=e[i].y;
		dep[y]=dep[x]+1;
		dfs(y);
		seq[++tot]=x;
	}
}
int lg[N],st[N][20];
inline int Min(int x,int y)
{
	return dep[x]<dep[y]?x:y;
}
void Build()
{
	dfs(1);
	for(int i=2;i<=tot;i++)
	lg[i]=lg[i>>1]+1;
	for(int i=1;i<=tot;i++)
	st[i][0]=seq[i];
	for(int k=1;k<=lg[tot];k++)
	for(int i=1;i+(1<<k)-1<=tot;i++)
	st[i][k]=Min(st[i][k-1],st[i+(1<<(k-1))][k-1]);
}
inline int LCA(int x,int y)
{
	int l=dfn[x],r=dfn[y];
	if(l>r)swap(l,r);
	int k=lg[r-l+1];
	return Min(st[l][k],st[r-(1<<k)+1][k]);
}
int tuc[N],ans=0;
inline void ins(int x)
{
	if(!tuc[x]) ans++;
	tuc[x]++;
}
int bel[N];
inline void del(int x)
{
	tuc[x]--;
	if(!tuc[x]) ans--;
}
bool cmp(node x,node y)
{
	if(bel[x.l]==bel[y.l]) return x.r>y.r;
	return x.l<y.l;
}
int Ls[N],Rs[N]; 
int Ans[N];
int pre[N],nxt[N];
bool vis[N];
int bck[N];
void ReBuild(int l,int r)
{
	ans=0;
	for(int i=1;i<=n;i++)
	vis[i]=nxt[i]=pre[i]=tuc[i]=0;
	for(int i=l;i<=r;i++)
	vis[pos[p[i]]]=1;
	int lst=0;
	for(int i=1;i<=n;i++)
	if(vis[i])
	{
		ins(bck[i]);
		pre[i]=lst;
		if(lst) nxt[lst]=i,ins(LCA(bck[lst],bck[i]));
		lst=i;
	}
} 
int stk[N],top=0;
inline void Del(int x,int f)
{
	int l=pre[pos[x]],r=nxt[pos[x]];
	del(x);
	if(f) stk[++top]=x;
	if(l) nxt[l]=r,del(LCA(bck[l],x));
	if(r) pre[r]=l,del(LCA(x,bck[r]));
	if(l&&r) ins(LCA(bck[l],bck[r]));
}
inline void Roll(int x)
{
	ins(x);
	int l=pre[pos[x]],r=nxt[pos[x]];
	if(l&&r) del(LCA(bck[l],bck[r]));
	if(l) nxt[l]=pos[x],ins(LCA(bck[l],x));
	if(r) pre[r]=pos[x],ins(LCA(x,bck[r]));
}
int main()
{
	freopen("escape.in","r",stdin);
	freopen("escape.out","w",stdout);
	n=read();m=read();
	for(int i=2;i<=n;i++)
	{
		int f=read();
		add(f,i);
	}
	Build();
	int B=sqrt(n);
	for(int i=1;i<=n;i++)
	bel[i]=(i-1)/B+1;
	for(int i=1;i<=n;i++)
	p[i]=read();
	for(int i=1;i<=n;i++)
	bck[pos[i]]=i;
	for(int i=1;i<=n;i++)
	Rs[bel[i]]=i;
	for(int i=n;i>=1;i--)
	Ls[bel[i]]=i;
	for(int i=1;i<=m;i++)
	{
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	int L=1,R=0,blocks=0;
	for(int i=1;i<=m;i++)
	{
		int l=q[i].l,r=q[i].r,id=q[i].id,o=bel[l];
		if(o!=blocks)
		{
			blocks=o;
			ReBuild(Ls[o],n);
			L=Ls[o];R=n;
		}
		while(R>r) Del(p[R--],0);
		int tmp=ans,po=L;
		top=0;
		while(L<l) Del(p[L++],1);
		Ans[id]=ans;
		while(top) Roll(stk[top--]);
		ans=tmp;
		L=po;
	}
	for(int i=1;i<=m;i++)
	printf("%d\n",Ans[i]);
	return 0;
}
